package com.example.community.service;

import com.example.community.utils.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

/**
 *
 */
@Service
public class LikeService {
    @Autowired
    private RedisTemplate redisTemplate;

    // 点赞, 点赞使用redis的set集合来记录
    // key为被点赞的内容的entityType和entityId, 可以用来定位到形如 帖子 第2233个 这样的唯一一个对象
    // value为发起这个点赞的userId, 即这个redis中的set记录的是 哪些user给这个实体点了赞
    public void like(int userId, int entityType, int entityId){
        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
        // 点一次赞, 点两次取消
        Boolean isMember = redisTemplate.opsForSet().isMember(entityLikeKey, userId);
        if(isMember){
            redisTemplate.opsForSet().remove(entityLikeKey, userId);
        }else {
            redisTemplate.opsForSet().add(entityLikeKey, userId);
        }
    }

    // 查询该实体点赞的数量
    public long findEntityLikeCount(int entityType, int entityId){
        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
        return redisTemplate.opsForSet().size(entityLikeKey);// 这个实体被点了多少赞
    }

    // 查询某人对某实体的点赞状态, 为了在前端显示点没点, (可能会有 踩 这么个状态, 所以用int)
    public int findEntityLikeStatus(int userId, int entityType, int entityId){
        String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
        return redisTemplate.opsForSet().isMember(entityLikeKey, userId)? 1: 0;
    }
}
